package com.redsoft.epip.util;

import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;

/**
 * 
 * Excel导出辅助工具类
 * 
 * <pre>
 * 参考 http://blog.csdn.net/wangchangpen62/article/details/44410967
 * </pre>
 * 
 * @author lixiaodong
 * @date 2017年9月4日
 * @since 1.0
 *
 */
public class ExportExcelUtil {

	/**
	 * 
	 * 创建工作簿对象
	 * <pre>
	 * 创建工作簿对象
	 * </pre>
	 * 
	 * @author lixiaodong
	 * @param title 标题
	 * @param dataList  数据
	 * @param rowName 列名
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static HSSFWorkbook createWorkBook(String title, List<Object[]> dataList, String[] rowName) {
		System.out.println("===============>创建工作簿");
		HSSFWorkbook workbook = new HSSFWorkbook();                     // 创建工作簿对象  
		HSSFSheet sheet = workbook.createSheet(title);                  // 创建工作表  
		System.out.println("===============>创建工作表！");

		// 产生表格标题行  
		HSSFRow rowm = sheet.createRow(0);  
		HSSFCell cellTiltle = rowm.createCell(0);  
		System.out.println("===============>创建表格标题行");

		//sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面  - 可扩展】  
		HSSFCellStyle columnTopStyle = ExportExcelUtil.getColumnTopStyle(workbook);//获取列头样式对象  
		System.out.println("===============>获取列头样式");
		HSSFCellStyle style = ExportExcelUtil.getStyle(workbook);                  //单元格样式对象  
		System.out.println("===============>获取单元格样式");

		sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length - 1)));    
		cellTiltle.setCellStyle(columnTopStyle);  
		cellTiltle.setCellValue(title);  

		// 定义所需列数  
		int columnNum = rowName.length;  
		HSSFRow rowRowName = sheet.createRow(2);                // 在索引2的位置创建行(最顶端的行开始的第二行)  
		System.out.println("===============>创建列，总共列数为：" + columnNum);

		// 将列头设置到sheet的单元格中  
		System.out.println("===============>将列头设置到sheet的单元格中");
		for(int n=0; n<columnNum; n++){  
			HSSFCell  cellRowName = rowRowName.createCell(n);               //创建列头对应个数的单元格  
			cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);             //设置列头单元格的数据类型  
			HSSFRichTextString text = new HSSFRichTextString(rowName[n]);  
			cellRowName.setCellValue(text);                                 //设置列头单元格的值  
			cellRowName.setCellStyle(columnTopStyle);                       //设置列头单元格样式  
		}  

		//将查询出的数据设置到sheet对应的单元格中  
		System.out.println("===============>将查询出的数据设置到sheet对应的单元格中。数据条数：" + dataList.size());
		for(int i=0; i<dataList.size(); i++){  

			Object[] obj = dataList.get(i);//遍历每个对象  
			HSSFRow row = sheet.createRow(i+3);//创建所需的行数  

			for(int j=0; j<obj.length; j++){  
				HSSFCell  cell = null;   //设置单元格的数据类型  
				if(j == 0){  
					cell = row.createCell(j,HSSFCell.CELL_TYPE_NUMERIC);  
					cell.setCellValue(i+1);   
				}else{  
					cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);  
					if(!"".equals(obj[j]) && obj[j] != null){  
						cell.setCellValue(obj[j].toString());                       //设置单元格的值  
					}  
				}  
				cell.setCellStyle(style);                                   //设置单元格样式  
			}  
		}  
		//让列宽随着导出的列长自动适应  
		System.out.println("===============>让列宽随着导出的列长自动适应 ");
		for (int colNum=0; colNum<columnNum; colNum++) {  
			int columnWidth = sheet.getColumnWidth(colNum) / 256;  
			for (int rowNum=0; rowNum<sheet.getLastRowNum(); rowNum++) {  
				HSSFRow currentRow = null;  
				//当前行未被使用过  
				if (sheet.getRow(rowNum) == null) {  
//					System.out.println("===============>当前行未被使用过");
					currentRow = sheet.createRow(rowNum);  
				} else {  
//					System.out.println("===============>当前行已经被使用 " + rowNum);
					currentRow = sheet.getRow(rowNum);  
				}  
				if (currentRow.getCell(colNum) != null) {  
//					System.out.println("===============>当前行cell不为空");
					HSSFCell currentCell = currentRow.getCell(colNum);  
					if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) { 
//						System.out.println("===============>当前行cell的值: " + currentCell.getStringCellValue());
						int length = currentCell.getStringCellValue().getBytes().length;  
						if (columnWidth < length) {  
							columnWidth = length;  
						}  
					} 
				} 
			}  
			if(colNum == 0){  
//				System.out.println("===============>当前是第一列 ");
				sheet.setColumnWidth(colNum, (columnWidth-2) * 256);  
			}else{  
//				System.out.println("===============>当前不是第一列 ");
				sheet.setColumnWidth(colNum, (columnWidth+4) * 256);  
			}  
		}  
		System.out.println("===============>创建完成：" + workbook);

		return workbook;
	}

	/**
	 * 
	 * 列头单元格样式
	 * <pre>
	 * 	列头单元格样式
	 * </pre>
	 * 
	 * @author lixiaodong
	 * @param workbook
	 * @return
	 */
	public static HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {  
		// 设置字体  
		HSSFFont font = workbook.createFont();  
		//设置字体大小  
		font.setFontHeightInPoints((short)11);  
		//字体加粗  
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
		//设置字体名字   
		font.setFontName("Courier New");  
		//设置样式;   
		HSSFCellStyle style = workbook.createCellStyle();  
		//设置底边框;   
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
		//设置底边框颜色;    
		style.setBottomBorderColor(HSSFColor.BLACK.index);  
		//设置左边框;     
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
		//设置左边框颜色;   
		style.setLeftBorderColor(HSSFColor.BLACK.index);  
		//设置右边框;   
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
		//设置右边框颜色;   
		style.setRightBorderColor(HSSFColor.BLACK.index);  
		//设置顶边框;   
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
		//设置顶边框颜色;    
		style.setTopBorderColor(HSSFColor.BLACK.index);  
		//在样式用应用设置的字体;    
		style.setFont(font);  
		//设置自动换行;   
		style.setWrapText(false);  
		//设置水平对齐的样式为居中对齐;    
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
		//设置垂直对齐的样式为居中对齐;   
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  

		return style;  
	}  

	/**
	 *     
	 * 列数据信息单元格样式 
	 * <pre>
	 * 列数据信息单元格样式 
	 * </pre>
	 * 
	 * @author lixiaodong
	 * @param workbook
	 * @return
	 */
	public static HSSFCellStyle getStyle(HSSFWorkbook workbook) {  
		// 设置字体  
		HSSFFont font = workbook.createFont();  
		//设置字体大小  
		//font.setFontHeightInPoints((short)10);  
		//字体加粗  
		//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
		//设置字体名字   
		font.setFontName("Courier New");  
		//设置样式;   
		HSSFCellStyle style = workbook.createCellStyle();  
		//设置底边框;   
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
		//设置底边框颜色;    
		style.setBottomBorderColor(HSSFColor.BLACK.index);  
		//设置左边框;     
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
		//设置左边框颜色;   
		style.setLeftBorderColor(HSSFColor.BLACK.index);  
		//设置右边框;   
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
		//设置右边框颜色;   
		style.setRightBorderColor(HSSFColor.BLACK.index);  
		//设置顶边框;   
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
		//设置顶边框颜色;    
		style.setTopBorderColor(HSSFColor.BLACK.index);  
		//在样式用应用设置的字体;    
		style.setFont(font);  
		//设置自动换行;   
		style.setWrapText(false);  
		//设置水平对齐的样式为居中对齐;    
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
		//设置垂直对齐的样式为居中对齐;   
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  

		return style;  
	}  

}
